package com.twb.auth.controller;

import com.twb.auth.common.TwbLoginUser;
import com.twb.auth.entity.twbResource.TwbResource;
import com.twb.auth.entity.twbResource.dto.*;
import com.twb.auth.entity.twbResource.vo.*;
import com.twb.auth.service.ITwbResourceService;
import com.twb.core.base.Result;
import com.twb.core.base.controller.BaseController;
import com.twb.core.base.entity.TwbPageInfo;
import com.twb.core.security.annotation.Auth;
import com.twb.core.util.BeanUtils;
import com.twb.core.util.Results;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @ClassName TwbResourceController
 * @Description 资源管理接口
 * @author DSY
 * @date 2018年11月9日 上午11:17:48
 */
@RestController
@RequestMapping("/sys/twbResource")
@Api(value = "TwbResourceController", tags = "资源管理接口")
public class TwbResourceController extends BaseController {

	@Autowired
	ITwbResourceService twbResourceService;

	/**
	 * @Title  searchTwbResource
	 * @Description 资源列表查询
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午12:13:44
	 */
	@GetMapping("/search")
	@ApiOperation(value = "资源列表查询")
	public Result<TwbPageInfo<SearchTwbResourceDto>> searchTwbResource(SearchTwbResourceVo param) {
		TwbPageInfo<SearchTwbResourceDto> pageInfo = twbResourceService.searchTwbResource(param);
		return Results.successWithData(pageInfo);
	}

	/**
	 * @Title searchList
	 * @Description 资源列表查询(不分页)
	 * @param param
	 * @return
	 * @author DHL
	 * @date 2022年3月17日 下午8:30:23
	 */
	@GetMapping("/searchList")
	@ApiOperation(value = "资源列表查询")
	public Result<List<SearchTwbResourceDto>> searchList(SearchTwbResourceVo param) {
		List<SearchTwbResourceDto> list = twbResourceService.searchTwbResourceList(param);
		return Results.successWithData(list);
	}

	/**
	 * @Title  searchTwbResourceTree
	 * @Description 资源树查询
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午3:47:24
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchTree")
	@ApiOperation(value = "资源列表树查询")
	public Result<List<SearchTwbResourceTreeDto>> searchTwbResourceTree(SearchTwbResourceTreeVo vo) {
		List<SearchTwbResourceTreeDto> list = twbResourceService.searchTwbResourceTree(vo);
		return Results.successWithData(list);
	}

	/**
	 * @Title  getTwbResourceById
	 * @Description 根据ID获取资源信息
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午4:04:31
	 */
	@GetMapping("/getById")
	@ApiOperation(value = "根据ID获取资源信息")
	public Result<GetTwbResourceByIdDto> getTwbResourceById(@NotBlank @RequestParam String id) {
		GetTwbResourceByIdDto twbResource = twbResourceService.getTwbResourceById(id);
		return Results.successWithData(twbResource);
	}

	/**
	 * @Title  validId
	 * @Description 验证资源ID是否存在
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月27日 下午12:23:58
	 */
	@Auth(verifyURL = false)
	@GetMapping("/validId")
	@ApiOperation(value = "验证资源ID是否存在")
	public Boolean validId(@NotBlank @RequestParam String id) {
		TwbResource resource = twbResourceService.getById(id);
		if (null == resource) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * @Title  updateTwbResourceById
	 * @Description 根据ID更新资源信息
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午4:44:31
	 */
	@PutMapping("/updateById")
	@ApiOperation(value = "根据ID更新资源信息")
	public Result<String> updateTwbResourceById(@RequestBody @Valid UpdateTwbResourceByIdVo vo) {
		boolean result = twbResourceService.updateTwbResourceById(vo);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}

	/**
	 * @Title updateParentResById
	 * @Description 修改父级菜单
	 * @param id
	 * @param parentResId
	 * @return
	 * @author DSY
	 * @date 2021年5月17日 下午12:29:38
	 */
	@PutMapping("/updateParentResById")
	@ApiOperation(value = "修改父级菜单")
	public Result<String> updateParentResById(@NotBlank String id, @NotBlank String parentResId) {
		TwbLoginUser loginUser = this.getLoginUser();
		TwbResource record = twbResourceService.getById(id);
		if (null == record) {
			return Results.failure("资源不存在");
		}
		record.setId(id);
		record.setParentResId(parentResId);
		record.setUpdateDate(LocalDateTime.now());
		record.setUpdater(loginUser.getLoginName());
		record.setUpdaterId(loginUser.getId());
		boolean result = twbResourceService.updateById(record);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}

	/**
	 * @Title  saveTwbResource
	 * @Description 保存资源信息
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午5:23:38
	 */
	@PostMapping("/save")
	@ApiOperation(value = "保存资源信息")
	public Result<String> saveTwbResource(@RequestBody @Valid SaveTwbResourceVo vo) {
		TwbResource countRecord = new TwbResource();
		countRecord.setId(vo.getId());
		long count = twbResourceService.count(countRecord);
		if (count > 0) {
			return Results.failure("资源编号【" + vo.getId() + "】已存在");
		}

		TwbResource insertRecord = new TwbResource();
		BeanUtils.copyNotNullProperties(vo, insertRecord);
		twbResourceService.setCreateInfo(insertRecord);
		boolean result = twbResourceService.saveTwbResource(insertRecord);
		if (result) {
			return Results.success("保存成功");
		} else {
			return Results.failure("保存失败");
		}
	}


	/**
	 * @Title  deleteTwbResourceById
	 * @Description 删除资源信息
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午5:51:57
	 */
	@PostMapping("/deleteById")
	@ApiOperation(value = "删除资源信息")
	public Result<String> deleteTwbResourceById(@NotBlank @RequestParam String id) {
		TwbResource record = twbResourceService.getById(id);
		if (null == record) {
			return Results.failure("资源不存在");
		}

		int result = twbResourceService.deleteTwbResourceById(id);
		if (result > 0) {
			return Results.success("删除成功");
		} else {
			return Results.failure("删除失败");
		}
	}

	/**
	 * @Title  updateResSeqById
	 * @Description 更新资源顺序号
	 * @param id
	 * @param resSeq
	 * @return
	 * @author DSY
	 * @date 2018年11月13日 下午2:15:54
	 */
	@PostMapping("/updateSeq")
	@ApiOperation(value = "更新资源顺序号")
	public Result<String> updateResSeqById(@NotBlank @RequestParam String id, @NotNull @RequestParam Integer resSeq) {
		TwbResource record = new TwbResource();
		record.setId(id);
		record.setResSeq(resSeq);
		twbResourceService.setUpdateInfo(record);
		boolean result = twbResourceService.updateById(record);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}

	/**
	 * @Title  searchAuthResourceTree
	 * @Description 机构、角色经办权限树
	 * @param type
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月21日 下午5:43:07
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchAuthResourceTree")
	@ApiOperation(value = "机构、角色经办权限树")
	public Result<List<SearchAuthResourceTreeDto>> searchAuthResourceTree(SearchAuthResourceTreeVo vo) {
		List<SearchAuthResourceTreeDto> list = twbResourceService.searchAuthResourceTree(vo);

		return Results.successWithData(list);
	}

	/**
	 * @Title  searchRoleAccreditResourceTree
	 * @Description 角色授权权限树
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月21日 下午6:15:07
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchRoleAccreditResourceTree")
	@ApiOperation(value = "角色授权权限树")
	public Result<List<SearchRoleAccreditResourceTreeDto>> searchRoleAccreditResourceTree(SearchRoleAccreditResourceTreeVo vo) {
		List<SearchRoleAccreditResourceTreeDto> list = twbResourceService.searchRoleAccreditResourceTree(vo);

		return Results.successWithData(list);
	}

	/**
	 * @Title saveResourceApi
	 * @Description 绑定资源api
	 * @param resourceId
	 * @param apiIds
	 * @return
	 * @author DSY
	 * @date 2021年5月26日 下午2:08:38
	 */
	@Auth(verifyURL = false)
	@PostMapping("/saveResourceApi")
	@ApiOperation(value = "绑定资源api")
	public Result<String> saveResourceApi(@NotBlank @RequestParam String resourceId, @RequestParam(required = false) String apiIds) {
		int result = twbResourceService.saveResourceApi(resourceId, apiIds);
		if (result > 0) {
			return Results.success("授权成功");
		} else {
			return Results.failure("授权失败");
		}
	}
	
	/**
	 * @Title updateStatusById
	 * @Description 更新资源状态
	 * @param resourceId
	 * @param status
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年8月2日 下午5:09:58
	 */
	@Auth(verifyURL = false)
	@PostMapping("/updateStatusById")
	@ApiOperation(value = "更新资源状态")
	public Result<String> updateStatusById(@NotBlank @RequestParam(required = true) String id, @RequestParam(required = true) String status) {
		int result = twbResourceService.updateResourceStatusById(id, status);
		if (result>0) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}
}
